﻿using System;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
using System.Linq;
using System.ComponentModel;
using DevExpress.XtraEditors;
using DevExpress.XtraGrid.Views.Base;
using DevExpress.XtraEditors.Controls;
using DevExpress.XtraGrid;
using DevExpress.XtraReports.UI;
using DevExpress.XtraSplashScreen;

using prjKQXS_UI.View;
using prjKQXS_DLL;
using prjKQXS_DLL.Hop_dong;
using prjKQXS_DLL.Truyen_thong;
using prjKQXS_Report.Truyen_thong;

namespace prjKQXS_UI.Truyen_thong
{
    public partial class frmNhapVeHuy_DL : DevExpress.XtraEditors.XtraForm
    {
        clsHuyVe cls = new clsHuyVe();
        clsHuyVeDL huyVeDL;
        SqlDataAdapter da;
        DataTable tblCanBo;/// <summary>
        /// Giá trị biến này tự động được gán là '%' khi chọn tất cả hoặc là mã đơn vị tương ứng khi chọn cán bộ từ lueDonVi
        /// </summary>
        char MaDV = '%';

        /// <summary>
        /// TenDV (Tên đơn vị) tự động được gán khi chọn đơn vị từ lueDonVi
        /// </summary>
        string TenDV;

        /// <summary>
        /// Giá trị biến này tự động được gán khi chọn cán bộ từ gvCanBo
        /// </summary>
        string MaCB = "";

        /// <summary>
        /// TenCB (Tên cán bộ) tự động được gán khi chọn cán bộ từ gvCanBo
        /// </summary>
        string TenCB;

        int _GiaVe = 0;
        string _KyHieuVe = "";

        #region Form =============================================================================
        public frmNhapVeHuy_DL(int GiaVe, string KyHieuVe, DateTime ngaymothuong)
        {
            InitializeComponent();
            //huyVeDL = new clsHuyVeDL(ngaymothuong);
            clsHuyVeDL.UpdateGiaVe(ngaymothuong, GiaVe);
            ucDonVi1.lueDonVi.EditValueChanged += new EventHandler(lueDonVi_EditValueChanged);
            cls.OnAction += new clsHuyVe.OnActionHandler(cls_OnAction);
            cls.OnError += new clsHuyVe.OnErrorHandler(cls_OnError);

            this._GiaVe = GiaVe;
            this._KyHieuVe = KyHieuVe;
        }string madonvi = "";
        private void frmNhapVeHuy_DL_Shown(object sender, EventArgs e)
        {
            deNgay.DateTime = BienTc.denngay;
            if (!BienTc.isMayChu())
            {
                // neu gap loi ngay thi bo doan nay
                //bool dateOK = deNgay.DateTime.Date == BienTc.currentDate.Date;
                // lay doan code nay
                bool dateOK = true;
                gvDaiLy.OptionsBehavior.Editable = dateOK;
                teMaDL.Enabled = dateOK;
                teSLVeNhan.Enabled = dateOK;
                teSLVeHuy.Enabled = dateOK;
            }
            //else
            //{
                
            //}
            huyVeDL = new clsHuyVeDL(deNgay.DateTime.Date);
            huyVeDL.OnAction += new clsHuyVeDL.OnActionHandler(cls_OnAction);
            huyVeDL.OnError += new clsHuyVeDL.OnErrorHandler(cls_OnError);
            huyVeDL.OnNewMessage += HuyVeDlOnOnNewMessage;
            //huyVeDL.OnChangedData += new clsHuyVeDL.OnChangedDataHandler(huyVeDL_OnChangedData);
            //huyVeDL.OnChangedBroker += new clsHuyVeDL.OnChangedBrokerHandler(huyVeDL_OnChangedBroker);
            loadLueDonVi();
            ucDonVi1.lueDonVi.Focus();
            sbtnInChiTiet.Enabled = false;
        }

        private void HuyVeDlOnOnNewMessage()
        {
            ISynchronizeInvoke i = (ISynchronizeInvoke)this;

            // Check if the event was generated from another
            // thread and needs invoke instead
            if (i.InvokeRequired)
            {
                clsHuyVeDL.NewMessage tempDelegate = new clsHuyVeDL.NewMessage(HuyVeDlOnOnNewMessage);
                i.BeginInvoke(tempDelegate, null);
                return;
            }

            // If not coming from a seperate thread
            // we can access the Windows form controls
            LoadData();
        }

        #endregion Form ==========================================================================

        #region Control ==========================================================================
        private void lueDonVi_EditValueChanged(object sender, EventArgs e)
        {
            try
            {
                SplashScreenManager.ShowForm(typeof(frmWaitForm));
                string madv = ucDonVi1.lueDonVi.GetColumnValue("Ma_DT").ToString().Trim();
                MaDV = huyVeDL.MaDV = madv == "TC" ? '%' : Convert.ToChar(madv);
                TenDV = ucDonVi1.lueDonVi.GetColumnValue("Ten_DT").ToString().Trim();
                //clsHuyVeDL._switchDependency = false;
                LoadData();
            }
            catch
            {
                throw;
            }
            finally
            {
                SplashScreenManager.CloseForm();
            }
       }

        #region txtmadl --------------------------------------------------------------------------
        bool runTextChanged = true;
        private void txtmadl_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                string ma1 = teMaDL.Text.ToString().Trim();
                if (ma1.Length < 4)
                {
                    teMaDL.Focus();
                }
                else 
                    if (ma1.Length == 4) 
                        teSLVeHuy.Focus();
                    else teMaDL.Focus();
            }           
        }

        private void txtmadl_TextChanged(object sender, EventArgs e)
        {
            if (runTextChanged)
            {
                string ma1 = teMaDL.Text.ToString().Trim();
                string ma2 = ucDonVi1.lueDonVi.GetColumnValue("Ma_DT").ToString();

                if (ma2 == "TC")
                {
                    clsCommon.MsgBox("Bạn phải chọn tên đơn vị cần nhập vé hủy!", 0);
                    teMaDL.Text = "";
                    ucDonVi1.lueDonVi.Focus();
                }
                else
                {
                    if (ma1.Length >= 1)
                    {
                        if (ma1.Substring(0, 1) != ma2)
                        {
                            clsCommon.MsgBox("Mã đại lý phải được bắt đầu bằng số " + ma2.ToString(), 0);
                            teMaDL.Focus();
                            teMaDL.SelectAll();
                        }
                    }
                }

                if (ma1.Length == 4)
                {
                    if (KiemTraMaDLNhapVeHuy(ma1, deNgay.DateTime) == false)
                    {
                        clsCommon.MsgBox("Mã đại lý này không tồn tại, hãy chọn mã khác !", 0);
                        teMaDL.Text = "";
                        teMaDL.Focus();
                        teMaDL.SelectAll();
                    }
                    else
                    {
                        lcTenDL.Text = getValue(ma1, gcolTenDL.FieldName).ToString();
                        teSLVeNhan.Text = getValue(ma1, gcolSLVeNhan.FieldName);
                        teSLVeHuy.Text = getValue(ma1, gcolSLVeHuy.FieldName);

                        if (teSLVeHuy.Text.Trim() != "" && teSLVeHuy.Text.Trim() != "0")
                        {
                            clsCommon.MsgBox("Mã đại lý này đã được nhập vé hủy rồi", 1);
                            teMaDL.Focus();
                            teMaDL.SelectAll();
                        }
                        else teSLVeHuy.Focus();
                    }
                }
            }
            else
            {
                runTextChanged = true;
            }

        }
        #endregion txtmadl -----------------------------------------------------------------------

        private void teSLVeHuy_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                string MaDL = teMaDL.Text.ToString().Trim();
                if ((Int32)clsCommon.Parse(teSLVeNhan.Text, 0) < (Int32)clsCommon.Parse(teSLVeHuy.Text, 0))
                {
                    clsCommon.MsgBox("Số lượng vé hủy không thể lớn hơn số lượng vé nhận", 0);
                    teSLVeHuy.Focus();
                }
                else
                {
                    int focused = 0;
                    string id = getValue(MaDL, "ID", ref focused);
                    string findItem = null;
                    for (int i = 0; i < huyVeDL.dt_VeHuyDL.Rows.Count; i++)
                    {
                        findItem = huyVeDL.dt_VeHuyDL.Rows[i]["ID"].ToString();
                        if (findItem.Equals(id))
                        {
                            huyVeDL.dt_VeHuyDL.Columns["SLVeHuy"].ReadOnly = false;
                            huyVeDL.dt_VeHuyDL.Rows[i]["SLVeHuy"] = teSLVeHuy.Text;
                            break;
                        }
                    }

                    huyVeDL.SaveTicket(_GiaVe, _KyHieuVe);
                    gvDaiLy.FocusedRowHandle = focused;
                    focusRow = focused;
                    teMaDL.Text = "";
                    lcTenDL.Text = "";
                    teSLVeNhan.Text = "";
                    teSLVeHuy.Text = "";
                    teMaDL.Focus();
                }
            }
        }

        private void cmbtendv_KeyDown(object sender, KeyEventArgs e)
        {
            teMaDL.Focus();
        }

        private void btnTim_Click(object sender, EventArgs e)
        {
            if (btnTim.Tag.Equals("LOC"))
            {
                btnTim.Tag = "BL";
                btnTim.Text = "F5. &Bỏ tìm";
                gvDaiLy.OptionsView.ShowAutoFilterRow = true;
            }
            else
            {
                gvDaiLy.OptionsView.ShowAutoFilterRow = false;
                btnTim.Tag = "LOC";
                btnTim.Text = "F5. &Tìm";
                gvDaiLy.ClearColumnsFilter();
            }
        }

        private void sbtnInChiTiet_Click(object sender, EventArgs e)
        {
            if (MaDV != '%')
            {
                if (!string.IsNullOrEmpty(MaCB.Trim()))
                {
                    rptTongHopCTTT rpt = new rptTongHopCTTT();
                    rpt.dtSource = cls.rptTongHopCTTT_DL(MaCB, deNgay.DateTime, deNgay.DateTime, ref rpt.TyLe);
                    rpt.pNgay.Value = deNgay.DateTime;
                    rpt.pTenDV.Value = TenDV;
                    rpt.pMaCB.Value = MaCB;
                    rpt.pTenCB.Value = TenCB;
                    rpt.ShowRibbonPreviewDialog();
                }
            }
            else
                clsCommon.MsgBox("Không in được,bạn hãy xem lại các thông tin cần in ./.", 0);
        }

        //Thủ tục này và sbtnInChiTiet bên cán bộ là giống nhau (chỉ khác nhau tham số truyền vào là "_DL")
        private void sbtnInTongHop_Click(object sender, EventArgs e)
        {
            if (MaDV != '%')
            {
                rptTongHopTT rpt = new rptTongHopTT();
                rpt.dtSource = cls.rptTongHopTT(MaDV, deNgay.DateTime, deNgay.DateTime, ref rpt.TyLe, "_DL");
                rpt.Parameters["pNgayMoThuong"].Value = deNgay.DateTime.Date;
                rpt.Parameters["pMaDV"].Value = MaDV;
                rpt.Parameters["pTenDV"].Value = TenDV;
                rpt.Parameters["pKyHieu"].Value = BienTc.KyHieuVe;
                rpt.ShowRibbonPreviewDialog();
            }
            else
                clsCommon.MsgBox("Không in được,bạn hãy xem lại các thông tin cần in ./.", 0);
        }

        private void sbtnDong_Click(object sender, EventArgs e)
        {
            SqlDependency.Stop(BienTc.connString);
            this.Close();
        }
        #endregion Control =======================================================================

        #region gv ===============================================================================
        private void gvDaiLy_ValidatingEditor(object sender, DevExpress.XtraEditors.Controls.BaseContainerValidateEditorEventArgs e)
        {
            if (gvDaiLy.FocusedColumn == gcolSLVeNhan || gvDaiLy.FocusedColumn == gcolSLVeHuy)
            {
                if (clsTruyenThong.DaNhapVesoRoi('L', deNgay.DateTime, madonvi))
                {
                    clsCommon.MsgBox("Không nhập được ở đây vì chi tiết đã nhập bên cán bộ hoặc công ty rồi", 1);
                    e.Value = gvDaiLy.GetFocusedRowCellValue(gvDaiLy.FocusedColumn);
                }
                else
                {
                    string a = e.Value.ToString().Trim();
                    if (a.ToString().Length == 0) e.Value = 0;
                    else
                    {
                        foreach (char c in a)
                        {
                            if (!char.IsDigit(c))
                            {
                                e.Valid = false;
                                e.ErrorText = "Bạn phải nhập giá trị là số.";
                                return;
                            }
                        }
                    }
                    
                    int nhan = 0;
                    if (gvDaiLy.FocusedColumn == gcolSLVeNhan)
                    {
                        nhan = e.Value.ToInt32();

                        //Kiểm tra nếu giá trị nhập vào bằng giá trị cũ thì kết thúc ngay, không cần việc cập nhật
                        int nhanOld = gvDaiLy.GetFocusedRowCellValue(gcolSLVeNhan).ToInt32();
                        if (nhan == nhanOld) { e.Valid = true; return; }
                    }
                    else nhan = gvDaiLy.GetFocusedRowCellValue(gcolSLVeNhan).ToInt32();

                    int huy = 0;
                    if (gvDaiLy.FocusedColumn == gcolSLVeHuy)
                    {
                        huy = Convert.ToInt32(e.Value);

                        //Kiểm tra nếu giá trị nhập vào bằng giá trị cũ thì kết thúc ngay, không cần việc cập nhật
                        int huyOld = gvDaiLy.GetFocusedRowCellValue(gcolSLVeHuy).ToInt32();
                        if (huy == huyOld) { e.Valid = true; return; }
                    }
                    else huy = gvDaiLy.GetFocusedRowCellValue(gcolSLVeHuy).ToInt32();

                    if (huy > nhan)
                    {
                        e.ErrorText = "Số lượng vé hủy không được lớn hơn số lượng vé nhận.";
                        e.Valid = false;
                    }
                }
            }
        }
        
        private void gvDaiLy_RowUpdated(object sender, RowObjectEventArgs e)
        {
            huyVeDL.SaveTicket(_GiaVe, _KyHieuVe);
        }

        private void gvDonVi_InvalidRowException(object sender, DevExpress.XtraGrid.Views.Base.InvalidRowExceptionEventArgs e)
        {
            e.ExceptionMode = ExceptionMode.NoAction;
        }
        private bool isLoad = false;
        private int focusRow = 0;
        
        private void gvDaiLy_FocusedRowChanged(object sender, FocusedRowChangedEventArgs e)
        {
           // if (!isLoad)focusRow = e.FocusedRowHandle;
        }

        private void gvCanBo_RowClick(object sender, DevExpress.XtraGrid.Views.Grid.RowClickEventArgs e)
        {
            MaCB = gvCanBo.GetFocusedRowCellValue(gcolMaCB2).ToString().Trim();
            TenCB = gvCanBo.GetFocusedRowCellValue(gcolTenCB2).ToString().Trim();
            sbtnInChiTiet.Enabled = true;
        }

        private void gcDaiLy_DataSourceChanged(object sender, EventArgs e)
        {
            gcCanBo.DataSource = huyVeDL.Reload_gcCanBo();
            sbtnInChiTiet.Enabled = false;
        }
        #endregion gv ============================================================================

        #region Sub and Func =====================================================================
        //bool resetForBroker = false;
        //private void huyVeDL_OnChangedBroker()
        //{
        //    clsCommon.MsgBox("Broker vừa được bật, bạn cần khởi động lại ứng dụng", 5);
        //    resetForBroker = true;//    Application.Exit();
        //}
        //private void huyVeDL_OnChangedData()
        //{
        //    if (clsCommon.formIsNotExisting(this.Name)) return;

        //    ISynchronizeInvoke i = (ISynchronizeInvoke)this;

        //    if (i.InvokeRequired)
        //    {
        //        clsHuyVeDL.OnChangedDataHandler h = new clsHuyVeDL.OnChangedDataHandler(huyVeDL_OnChangedData);
        //        i.BeginInvoke(h, null);
        //        return;
        //    }

        //    LoadData();
        //}

        private void loadLueDonVi()
        {
            ucDonVi1.lueDonVi.Properties.DataSource = clsCommon.load_lueDonVi();

            if (BienTc.isQuanHuyen || BienTc.isThanhPho || !clsCommon.hasPermission(BienTc.UserID, (int)BienTc.eFunction.L_DonVi))
            {
                ucDonVi1.lueDonVi.ItemIndex = ucDonVi1.lueDonVi.Properties.GetDataSourceRowIndex("Ma_DT", BienTc.ma_huyen == "" ? "TC" : BienTc.ma_huyen);
                if (BienTc.isQuanHuyen || BienTc.isThanhPho) ucDonVi1.lueDonVi.Properties.ReadOnly = true;
            }
            else ucDonVi1.lueDonVi.ItemIndex = 0;


            //Đoạn này sẽ xóa khi không còn dùng đến vào 2015
            ////Không UpdateGiatriDV khi MaDV = '%' (toàn công ty) vì sẽ làm mất GiaVe và KyHieu của đơn vị khác.
            ////Vì vậy chỉ UpdateGiatriDV khi ucDonVi1.lueDonVi.ItemIndex > 0 (<=> MaDV != '%')
            //if (ucDonVi1.lueDonVi.ItemIndex > 0)
            //    huyVeDL.UpdateGiatriDV(_GiaVe, _KyHieuVe, MaDV, deNgay.DateTime);
        }

        private void LoadData()
        {
                gcDaiLy.DataSource = huyVeDL.Reload_gcDaiLy();
                gvDaiLy.FocusedRowHandle = focusRow;
                gvDaiLy.SelectRow(focusRow);
        }

        private bool KiemTraMaDLNhapVeHuy(string ma_daiLy, DateTime Ngay)
        {
            bool retVal = false;

            for (int i = 0; i < gvDaiLy.RowCount; i++)
            {
                if (gvDaiLy.GetRowCellValue(i, gcolMaDL).ToString().Trim() == ma_daiLy)
                {
                    retVal = true;
                    break;
                }
            }

            return retVal;
        }

        private string getValue(string ma_daiLy, string tenCot, ref int focusedRowHandle)
        {
            string value = "";

            for (int i = 0; i < gvDaiLy.RowCount; i++)
            {
                if (gvDaiLy.GetRowCellValue(i, gcolMaDL).ToString().Trim() == ma_daiLy)
                {
                    value = gvDaiLy.GetRowCellValue(i, tenCot).ToString().Trim();

                    //Khi nhập trong gv thì tự có focus, nhưng khi nhập từ teSLVeHuy thì dòng tương ứng với đại lý đang nhập chưa có focus
                    //=> tạo focus cho dòng này trong trường hợp nhập từ teSLVeHuy
                    focusedRowHandle = i;
                    break;
                }
            }

            return value;
        }

        private string getValue(string ma_daiLy, string tenCot)
        {
            string value = "";

            for (int i = 0; i < gvDaiLy.RowCount; i++)
            {
                if (gvDaiLy.GetRowCellValue(i, gcolMaDL).ToString().Trim() == ma_daiLy)
                {
                    value = gvDaiLy.GetRowCellValue(i, tenCot).ToString().Trim();
                    break;
                }
            }

            return value;
        }

        #region cls event --------------------------------------------
        private void cls_OnAction(SqlException e)
        {
            cls_OnError(e);
        }

        private void cls_OnError(Exception e)
        {
            XtraMessageBox.Show("Một lỗi chưa được xử lý đã xảy ra. Chi tiết lỗi: \n" + e.Message, "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
            this.Close();
        }
        #endregion cls event -----------------------------------------
        #endregion Sub and Func ==================================================================

        }
}